package ltd.hxya.novel.common.utils;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectResult;
import org.apache.commons.codec.binary.Base64;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.*;

public class OssUtils {
    // Endpoint以杭州为例，其它Region请按实际情况填写。
    private static String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
    private static String accessKeyId = "LTAI5tDiadK6jK65MQA1iTJz";
    private static String accessKeySecret = "JIjnK3esUgEyCr2dN64ZlwHFPkUXOb";
    // 填写Bucket名称。
    private static String bucketName = "hxya-novel";
    // 填写待上传的本地文件的完整路径。

    // 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。

    // 填写不包含Bucket名称在内的Object的完整路径。
    private static String objectName = "";

    public static Map<String,String> upload(String fileName) throws Exception {
        // 在URL中添加Bucket名称，添加后URL格式为http://yourBucketName.oss-cn-hangzhou.aliyuncs.com。
        endpoint = endpoint.replace("https://", "https://" + bucketName+ ".");
        // 设置表单Map。
        Map<String, String> formFields = new LinkedHashMap<String, String>();
        // 设置文件名称。
        getFilePath(fileName);
        formFields.put("key", objectName);
        formFields.put("OSSAccessKeyId", accessKeyId);
        LocalDateTime now = LocalDateTime.now();
        String policy = "{\"expiration\": \"2120-01-01T12:00:00.000Z\",\"conditions\": [[\"content-length-range\", 0, 104857600]]}";
        String encodePolicy = new String(Base64.encodeBase64(policy.getBytes()));
        // 设置policy。
        formFields.put("policy", encodePolicy);
        // 生成签名。

        String signaturecom = com.aliyun.oss.common.auth.ServiceSignature.create().computeSignature(accessKeySecret, encodePolicy);
        // 设置签名。
        formFields.put("Signature", signaturecom);
        System.out.println(formFields.toString());
        return formFields;
    }

    private static void getFilePath(String fileName) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        String nowDate = simpleDateFormat.format(new Date());
        UUID uuid = UUID.randomUUID();
        objectName=nowDate+"/"+uuid.toString()+"_"+ fileName;
    }

    /**
     * 上传网络流
     * @param imgUrl
     * @throws IOException
     */
    public static String uploadNetworkFlow(String imgUrl) throws IOException {
        // 填写Object完整路径，完整路径中不能包含Bucket名称，例如exampledir/exampleobject.txt。
        String[] strings = imgUrl.split("/");
        String fileName = strings[strings.length - 1];
         getFilePath(fileName);
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {
            InputStream inputStream = new URL(imgUrl).openStream();
            // 创建PutObject请求。
            ossClient.putObject(bucketName, objectName, inputStream);
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
        String urlStr = endpoint.replace("https://", "https://" + bucketName+ ".");
        //https://hxya-novel.oss-cn-hangzhou.aliyuncs.com/2022-09-24/339ca8d9-2f1e-4eea-9b86-cbcad8221644_qrcode.jpg
        return urlStr+"/"+objectName;
    }

}
